package main

import (
	"fmt"
	"github.com/gin-gonic/gin"
	"time"
)

// 定义中间件
func MiddleWare() gin.HandlerFunc {
	return func(context *gin.Context) {
		nowTime := time.Now()

		fmt.Println("中间件开始执行...")
		// 设置到context中
		context.Set("request", "中间件")
		// 执行中间件
		context.Next()

		status := context.Writer.Status()
		fmt.Println("中间件执行完毕...", status)

		endTime := time.Since(nowTime)
		fmt.Println("执行 time: ", endTime)
	}
}

func main() {
	r := gin.Default()
	// 注册中间件
	r.Use(MiddleWare())

	{
		// 这个是全局的
		r.GET("/middleware", func(context *gin.Context) {
			// 取值
			req, _ := context.Get("request")
			fmt.Println("request: ", req)
			// 页面接收
			context.JSON(200, gin.H{"request": req})
		})

		// 这样就是局部的
		r.GET("/middleware2", MiddleWare(), func(context *gin.Context) {
			// 取值
			req, _ := context.Get("request")
			fmt.Println("request: ", req)
			// 页面接收
			context.JSON(200, gin.H{"request": req})
		})
	}

	r.Run(":8000")
	// 测试: 浏览器访问 http://localhost:8000/middleware
	// 请求 http://localhost:8000/middleware2 局部的,发现走了两遍,先走了全局的,又走了局部的
}
